#include <iostream>
using namespace std;
// 公有继承（public）：当一个类派生自公有基类时，基类的公有成员也是派生类的公有成员，基类的保护成员也是派生类的保护成员，基类的私有成员不能直接被派生类访问
// 保护继承（protected）： 当一个类派生自保护基类时，基类的公有和保护成员将成为派生类的保护成员。
// 私有继承（private）：当一个类派生自私有基类时，基类的公有和保护成员将成为派生类的私有成员。
class People
{
private:
    int age;

protected:
    int height;

public:
    char name;
    People(char name, int age, int height) : name{name}, age{age}, height{height}
    {
    }
    void printfAge()
    {
        cout << age << endl;
    }
};
class Student : public People
{
public:
    int classNo;
    // 调用父类构造函数
    Student(char name, int age, int height, int classNo) : People{name, age, height}, classNo{classNo}
    {
    }
    void prient_height()
    {
        // cout << age << endl;
        cout << height << endl;
    }
};

class Teacher : protected People
{
public:
    char subject;
    Teacher(char name, int age, int height, char subject) : People{name, age, height}, subject{subject}
    {
    }
    void printf_height_name()
    {
        cout << "Teacher's name is " << name << endl;
        cout << "Teacher's height is " << height << endl;
    }
};

// 默认是私有继承， private可以省略
// class Driver : private People
class Driver : People
{
public:
    char car;
    Driver(char name, int age, int height, char car) : People{name, age, height}, car{car}
    {
    }
    void printf_driver()
    {
        cout << "Driver' height is " << height << endl;
        cout << "Driver' car is " << car << endl;
    }
};
int main()
{

    // 1、Student public 继承自 People
    Student s1('A', 18, 170, 99);
    s1.printfAge();
    // cout << s1.height << endl;
    s1.prient_height();

    // 2、Teacher protected 继承自 People
    Teacher t('B', 28, 180, 'K');
    // t.printfAge();
    t.printf_height_name();

    // 3、Driver private 继承自people
    Driver d('C', 22, 200, 'G');
    d.printf_driver();
    // d.printfAge();
    return 0;
}

// 一个派生类继承了所有的基类方法，但下列情况除外：
// 基类的构造函数、析构函数和拷贝构造函数。
// 基类的重载运算符。
// 基类的友元函数。